
#ifndef  KEY_C  
#define  KEY_C

 #include "key_process.h"
#include "iodefine.h"
#include "soft_time.h"
/*-----------------*
 |  Private Data
 *-----------------*/


#define ADD_KEY   3//?????
#define ELEMENT_NUMBER	 (5+ADD_KEY)//9
#define KEY_UP           0
#define KEY_PRESS_SHORT  1
#define KEY_PRESS_LONG   2
//用来判断在是否存在多个按键被按下，不包括组合键，
#define KEY_TIME_PRESS   20
#define  KEY_PRESS_LONG_TIME  75//1.5S


#define  KEY_1 P13_bit.no7
#define  KEY_2 P2_bit.no0
#define  KEY_3 P2_bit.no1
#define  KEY_4 P12_bit.no1

#define  KEY_5 P12_bit.no2

#define  KEY_POWER           0x1//,1
#define  KEY_DECREASE        0x2//,4	
#define  KEY_INCREASE        0x4//,2   
#define  KEY_ECO           0x8//,1
#define  KEY_SUPER         0x10

#define  KEY_counts          2
#define  KEY_up_conuts       2
/*
#define    KEY_POWER        (1<<0)
#define    KEY_SELECT       (1<<1 )
#define    KEY_BOOK         (1<<2 )
#define    KEY_MACHINECARE     (1<<3 )
#define    KEY_INTENSIVE  (1<<4 )
#define    KEY_RUN_PAUSE    (1<<5 )

uint32_t Get_btn_mask(void)
{
	uint16_t data=0;
	
	data+=  KEY_POWER_IO ;
	data+=  KEY_PROGRAM_IO <<1     ;  
	data+=  KEY_DELAYTIME_IO  <<2   ; 
	data+=  KEY_MACHINECARE_IO <<3  ; 
	data+=  KEY_INTENSIVE_IO   <<4  ; 
	data+=  KEY_STARTPAUSE_IO  <<5  ;
	
	data=~data;
	data=data&0x3f;
	
	return data;
	
}

void CapsenseScan()
{    
	button_stat =Get_btn_mask();
 
}


*/
 extern Time one_minute_version;

static uint16_t Key_Map[ELEMENT_NUMBER]={
   // 0,
	KEY_POWER,
	KEY_DECREASE,
	KEY_INCREASE,
 	KEY_ECO,
	KEY_SUPER,
	
	KEY_POWER+KEY_INCREASE, //TEST
	KEY_POWER+KEY_ECO,   //WIFI
	KEY_DECREASE+KEY_INCREASE//version
    
};
struct Key_Info 
{
    uint32_t key_mask;
    uint8_t  ke_stat[ELEMENT_NUMBER];
    uint8_t  key_count[ELEMENT_NUMBER];
    uint8_t  key_up_count[ELEMENT_NUMBER];
};

struct Key_Info key_info;

static KEY_NAMES key_Event_Id=KEY_NONE;
static uint8_t key_Same=0;
static KEY_NAMES key_Event_Id_Old=KEY_NONE;
  uint8_t button_stat=0;
//static KEY_NAMES   keyEvent;      /* signal keyEvent, indicate what key is pressed */
uint8_t key_cnt_test=0;
 /*---------------------------------------------------------------------------*
 |  KeyInit
 |
 |  Initialize the key module. Called once on power-up.
 |
 |  For details see Key.h
 *---------------------------------------------------------------------------*/
void KeyInit(void)
{
    button_stat=0;
}

void Event_Clean(void)
{
    uint8_t i;
    
        key_Event_Id=KEY_NONE;
        key_Event_Id_Old=KEY_NONE;
        key_Same=0;
        for(i=0;i<(ELEMENT_NUMBER);i++)  {
            key_info.ke_stat[i]=KEY_UP;
        }
}

/*---------------------------------------------------------------------------*
 |  KeyEvent
 |
 |  For details see Key.h
 *---------------------------------------------------------------------------*/


uint8_t KeyEvent(void)
{
    uint8_t event_id=0;

    uint8_t i;
    for(i=0;i<(ELEMENT_NUMBER);i++){
        //只有长按和短按进行判断，其他情况不进行处理
    	if(key_info.ke_stat[i]==KEY_PRESS_SHORT||key_info.ke_stat[i]==KEY_PRESS_LONG) 
			event_id= 2*i+ key_info.ke_stat[i];//key_info.ke_stat ???? 0,1,2
    }
    return event_id; 
}

//uint32_t Get_btn_mask(void)
//{
//	uint16_t data=0;
	
//	data+=  KEY_POWER_IO ;
//	data+=  KEY_PROGRAM_IO <<1     ;  
//	data+=  KEY_DELAYTIME_IO  <<2   ; 
//	data+=  KEY_MACHINECARE_IO <<3  ; 
//	data+=  KEY_INTENSIVE_IO   <<4  ; 
//	data+=  KEY_STARTPAUSE_IO  <<5  ;
	
//	data=~data;
//	data=data&0x3f;
	
//	return data;	
//}

void  Button_stat(void)
{
	button_stat=0;
	if(KEY_1==0)button_stat|=1;
	if(KEY_2==0)button_stat|=2;
	if(KEY_3==0)button_stat|=4;
	if(KEY_4==0)button_stat|=8;
	
	if(KEY_5==0)button_stat|=0x10;

}
/*---------------------------------------------------------------------------*
 |  KeyKeyProcess
 |
 |  Called once per line sync.  For details see Key.h
 *---------------------------------------------------------------------------*/
void KeyProcess(void)
{
    uint8_t i;
    uint8_t j;
    static uint32_t key_mask_old=0;  

	Button_stat();//????
	// ???		??1		??2			??3	     ??1+??3		??4			??5				??2+??3||(button_stat==0x06)
	if((button_stat==0)||(button_stat==1)||(button_stat==2)||(button_stat==0x4)||(button_stat==0x08)||(button_stat==0x10)){
		//rinnai_delay_us(5000);
//		key_cnt_test++;
//		if(key_cnt_test>=2){
//			key_cnt_test=0;
//			if(button_stat!=6){
				key_info.key_mask = button_stat;//KeyMatrixLevel();????????   /* get key press reading */
//			}
//		}
	}
    //必须在1.5秒之内，按下POWER和ECO键才能触发组合键。
    else if((key_info.key_count[0]!=0x4b&&key_info.key_count[3]!=0x4b)&&(button_stat==0x09))
    {
        key_info.key_mask = button_stat;
    }
    //在50秒以内，按下上键和下键这个组合键，并且要上建和下键长按，才能处理
    else if(one_minute_version.time_min<2&&(button_stat==0x06)&&(key_info.ke_stat[1]!=KEY_PRESS_LONG)&&(key_info.ke_stat[2]!=KEY_PRESS_LONG))
    {
        key_info.key_mask = button_stat;
    }
    //if(key_info.key_mask!=button_stat)//存在其他的情况,不是组合键，或者组合键按下方式不对，或者
    else
    {
        //组合键情况，当前按下，但是并不是设定组合键，而且组合键其中一个按键已经进行了长按，
        for(i=0;i<(ELEMENT_NUMBER);i++)
        {
            //找出最先按下的按键，最先按下的，最先到达长按时间
            if(((button_stat&Key_Map[i])!=0)&&(key_info.key_count[i]==0x4b))
            {
                //再次遍历，找出后面按下的，为了防止后面按下了两三个，所以在这里不进行跳出，
                for(j=0;j<(ELEMENT_NUMBER);j++)
                {
                    if((i!=j)&&((button_stat&Key_Map[j])!=0))
                    {
                        key_info.key_count[j]=0; 
                        //把它设置成这个标记位
                        key_info.ke_stat[j]=KEY_TIME_PRESS;
                    }
                }
            }
        }
        
    }
    if(key_info.key_mask==0)
    {
        key_mask_old=0;
        //判断是不是没有按键按下
        for(i=0;i<(ELEMENT_NUMBER);i++)
        {
            if(key_info.key_up_count[i]!=KEY_up_conuts)
            {
                key_mask_old=1;
            }
        }
        if(key_mask_old==0)
        {
            Event_Clean();
            return;//结束函数，
        }
    }
	//if(key_info.key_mask==0){//无按键按下
     //  if(key_mask_old==0){//上一个状态也是无按键按下
            //key_mask_old=key_info.key_mask;
    //        Event_Clean();
    //        return;//结束函数，
     //   }
    //    else {   //上一个状态有按键按下
    //        key_mask_old=key_info.key_mask;//覆盖值
    //    }
//        return;
       
        //if(key_mask_old>KEY_count)
       // {
       //     Event_Clean();
       //     return;//结束函数，
       // } 
       // key_mask_old++;
    //}
    //else{ //当前有按键按下
        //key_mask_old = 0;
	//    key_mask_old = key_info.key_mask;
    //}
    for(i=0;i<ELEMENT_NUMBER;i++)//20mS
	{
    	if(key_info.key_mask == Key_Map[i]){ 
            //存在短暂的拉高
            if(key_info.key_up_count[i]<KEY_up_conuts&&key_info.key_up_count[i]>0)
            {
                //出现一次很短的按下，然后抬起，抬起时间也很短
                //按下次数小于三次，小于60MS，马上又抬起了
                if(key_info.key_count[i]<KEY_counts)
                {
                    key_info.key_count[i]=0;
                }
                key_info.key_up_count[i]=0;
            }
            //当前第一次进来，上拉计数清空。
            if(key_info.key_count[i]==0)
            {
                key_info.key_up_count[i]=0;
            }
            if(key_info.key_count[i]<200&&key_info.ke_stat[i]!=KEY_TIME_PRESS)key_info.key_count[i]++;
            if(key_info.key_count[i]>=KEY_PRESS_LONG_TIME){
                key_info.key_count[i]=KEY_PRESS_LONG_TIME;
                if(i!=3&&i!=0)//PowerOnOff ECO
                {
                    key_info.ke_stat[i]=KEY_PRESS_LONG;//??????
                }
            }
	    
            if(key_info.key_count[i]==KEY_counts && i!=0x3  && i!=4 && i!=0 ){
				key_info.ke_stat[i]=KEY_PRESS_SHORT;//?????
            }
            
        }
        else{//????
            //两种情况，1是，组合键，清掉分键的计数，2是，后按的按键标记数被清理掉
            if((key_info.key_mask&Key_Map[i])!=0)//?????,??????
            {
                key_info.key_count[i]=0; 
                key_info.ke_stat[i]=KEY_UP;
            } 
	    	//
            //if(key_info.key_count[i]>0) key_info.ke_stat[i]=KEY_PRESS_SHORT; //press short 5*50ms
	     	//if((key_info.key_count[i]>0) && (i==3  || i==5 || i==0))//&&key_mask_old==KEY_count
		//{
		//	key_info.ke_stat[i]=KEY_PRESS_SHORT; //press short 5*50ms
			//key_info.key_count[i]=0; 
		//}
		//if(key_info.key_count[i]==KEY_PRESS_LONG_TIME&&(i==0||3==i))//&&key_mask_old==KEY_count
		//{
		//	key_info.ke_stat[i]=KEY_PRESS_LONG; //press long  *50ms
			//key_info.key_count[i]=0;  
		//}
		//if(key_mask_old==KEY_count)
		//{
		//	key_info.key_count[i]=0;
        
		//}	
            //当前这个按键处于上拉状态
            key_info.key_up_count[i]++;
            //最大五次
            if(key_info.key_up_count[i]>KEY_up_conuts)
            {
                key_info.key_up_count[i]=KEY_up_conuts;
                key_info.key_count[i]=0;
                if(key_info.ke_stat[i]!=KEY_TIME_PRESS) 
                {
                    key_info.ke_stat[i]=KEY_UP;
                }
               
            }
            //按下次数大于三次，大于60MS，马上又抬起了
            if(key_info.key_count[i]>=KEY_counts)
            {
                //key_info.key_up_count[i]++;
                if(key_info.key_up_count[i]>=KEY_up_conuts)
                {
                     //判断是不是长按
                    if(key_info.key_count[i]==KEY_PRESS_LONG_TIME&&(i==0||3==i))//&&key_mask_old==KEY_count
                    {
                        key_info.ke_stat[i]=KEY_PRESS_LONG; //press long  *50ms
                        //key_info.key_count[i]=0;  
                    }
                    //判断是不是短按
                    else if((key_info.key_count[i]>=KEY_counts&&key_info.key_count[i]<KEY_PRESS_LONG_TIME) && (i==3  || i==4 || i==0))//&&key_mask_old==KEY_count
                    {
                        key_info.ke_stat[i]=KEY_PRESS_SHORT; //press short 5*50ms
                        //key_info.key_count[i]=0; 
                    }
                   
                    //按下计时清零
                    key_info.key_count[i]=0;
                }
            }
            //按下次数小于三次，小于60MS，马上又抬起
            else
            {
                key_info.key_count[i]=0;
            }
                              
        }
    }
   	
    key_Event_Id=KeyEvent();
    if( key_Event_Id_Old==key_Event_Id) key_Same=1;
    else key_Same=0;
    key_Event_Id_Old=key_Event_Id;

}

/*---------------------------------------------------------------------------*
 |  KeyBufferClear
 |
 |  Clear buffer of all key presses.  For details see Key.H
 *---------------------------------------------------------------------------*/
uint8_t EventListener( KEY_NAMES  keyEvent)
{
//    if(key_Event_Id_Old==key_Event_Id)  return 0;
    
    if(keyEvent==KEY_NONE && (key_Event_Id==KEY_NONE || key_Same==1) )  {
        
//        if( key_Same==1)  DBUG_PutString(" key_Same \r\n");
        return 1;   
    }
    
    if(keyEvent==key_Event_Id && key_Same==0) {
        return 1;
    }
    if(keyEvent==key_Event_Id && key_Event_Id==KEY_INCREASE_LONG) {

        return 1;
    }
    if(keyEvent==key_Event_Id && key_Event_Id==KEY_DECREASE_LONG) {
        return 1;
    }
    return 0;
}


#endif



